"""
秘境挑战任务模块
实现秘境挑战副本的自动化任务
"""

import time
import pyautogui
from loguru import logger
from .skill_manager import SkillManager

class MijingTask:
    def __init__(self, game_automation):
        """
        初始化秘境挑战任务
        
        Args:
            game_automation: GameAutomation 实例，用于执行基础操作
        """
        self.game = game_automation
        self.skill_manager = SkillManager()

    def move_and_find_mijing(self):
        """
        移动并寻找秘境探险入口
        使用GameAutomation的通用搜索方法
        返回是否找到秘境探险入口
        """
        found, pos, w, h = self.game.search_with_movement(
            target_image="templates/mijing/mijing_text.png",
            search_attempts=3,  # 搜索尝试次数
            move_left_key='a',  # 向左移动的按键
            move_right_key='d',  # 向右移动的按键
            move_duration=1,  # 移动持续时间
            wait_duration=1,  # 移动后等待时间
            confidence=0.7  # 图像匹配置信度
        )
        
        if found:
            logger.info("找到秘境探险入口")
            return True
        else:
            logger.error("无法找到秘境探险入口")
            return False

    def check_battle_end(self):
        """检查战斗是否结束
        战斗结束判定：检测到back_button或mijing_reward或start_battle任意一个
        返回值：
        - "back_button": 检测到返回按钮
        - "mijing_reward": 检测到奖励按钮
        - "start_battle": 检测到出战按钮
        - None: 战斗未结束
        """
        logger.debug("开始检查战斗是否结束")
        # 检查是否已经返回出战页面
        start_battle_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/start_battle.png", confidence=0.7)
        if start_battle_pos:
            logger.info("检测到已返回出战页面")
            return "start_battle"

        # 检查是否出现返回按钮
        back_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/back_button.png", confidence=0.7)
        if back_pos:
            logger.info("检测到返回按钮")
            return "back_button"

        # 检查是否出现奖励按钮
        reward_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/mijing_reward.png", confidence=0.7)
        if reward_pos:
            logger.info("检测到奖励按钮")
            return "mijing_reward"

        logger.debug("所有检查都未通过，战斗继续")
        return None

    def handle_battle_end(self, end_state):
        """处理战斗结束后的退出流程
        Args:
            end_state: 战斗结束状态，可能的值：
                - "back_button": 检测到返回按钮
                - "mijing_reward": 检测到奖励按钮
                - "start_battle": 检测到出战按钮
        Returns:
            bool: 是否成功返回到出战页面
        """
        max_wait_time = 5  # 最大等待时间（秒）
        start_time = time.time()

        if end_state == "start_battle":
            logger.info("已经在出战页面，无需处理")
            return True

        if end_state == "back_button":
            logger.info("点击返回按钮")
            if self.game.click_image_center("templates/mijing/back_button.png", confidence=0.7):
                logger.info("等待奖励按钮出现")
                while time.time() - start_time < max_wait_time:
                    reward_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/mijing_reward.png", confidence=0.7)
                    if reward_pos:
                        return self.handle_battle_end("mijing_reward")
                    time.sleep(0.5)
                logger.warning("点击返回按钮后未检测到奖励按钮")
                return False

        if end_state == "mijing_reward":
            logger.info("点击奖励按钮")
            if self.game.click_image_center("templates/mijing/mijing_reward.png", confidence=0.7):
                logger.info("等待返回出战页面")
                while time.time() - start_time < max_wait_time:
                    start_battle_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/start_battle.png", confidence=0.7)
                    if start_battle_pos:
                        logger.info("已返回到出战页面")
                        return True
                    time.sleep(0.5)
                logger.warning("点击奖励按钮后未检测到出战页面")
                return False

        return False

    def execute(self, battle_times=3):
        """执行秘境挑战任务"""
        logger.info("开始执行秘境挑战任务")
        # 检查当前页面状态，从当前页面开始执行
        current_page = self.check_current_page()
        if current_page == "unknown":
            logger.error("无法识别当前页面状态，任务失败")
            return False
        logger.info(f"当前页面状态: {current_page}")

        # 根据当前页面状态执行相应操作
        if current_page == "忍者挑战页面":
            if not self.game.click_image_center("templates/mijing/renzhe_text.png", confidence=0.7):
                logger.error("未找到忍者挑战图片，任务失败")
                return False
            time.sleep(2)
            current_page = "秘境入口页面"

        if current_page == "秘境入口页面":
            if not self.game.click_image_center("templates/mijing/mijing_entrance.png", confidence=0.7):
                logger.error("未找到秘境探险入口，任务失败")
                return False
            time.sleep(2)
            current_page = "创建房间页面"

        if current_page == "创建房间页面":
            if not self.game.click_image_center("templates/mijing/create_room.png", confidence=0.7):
                logger.error("未找到创建房间按钮，任务失败")
                return False
            time.sleep(2)
            current_page = "出战页面"

        # 开始战斗循环
        for i in range(battle_times):
            logger.info(f"开始第 {i + 1} 次挑战")
            # 点击出战
            if not self.game.click_image_center("templates/mijing/start_battle.png", confidence=0.6):
                logger.error("未找到出战按钮，重试")
                continue
            logger.info("点击出战按钮，等待战斗结束")
            # 处理两种情况：1. 需要点击确认按钮 2. 直接进入战斗
            confirm_timeout = 10  # 等待确认按钮出现的超时时间
            confirm_start = time.time()
            confirm_clicked = False
            
            # 先等待确认按钮出现
            while (time.time() - confirm_start) < confirm_timeout:
                confirm_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/confirm_button.png", confidence=0.7)
                if confirm_pos:
                    logger.info("检测到确认按钮，点击确认")
                    if self.game.click_image_center("templates/mijing/confirm_button.png", confidence=0.7):
                        confirm_clicked = True
                        logger.info("已点击确认按钮")
                    break
                time.sleep(0.5)
            
            # 无论是否点击确认按钮，都等待拳头图片出现
            fist_found = False
            fist_timeout = 20  # 超时时间（秒）
            fist_start = time.time()
            while (time.time() - fist_start) < fist_timeout:
                fist_pos, _, _, _ = self.game.find_image_on_screen("templates/mijing/quantou.png", confidence=0.7)
                if fist_pos:
                    fist_found = True
                    if confirm_clicked:
                        logger.info("检测到拳头图片，进入战斗（已点击确认按钮）")
                    else:
                        logger.info("检测到拳头图片，直接进入战斗（无需确认）")
                    break
                time.sleep(0.5)
            if not fist_found:
                logger.error("等待拳头图片超时，跳过本轮")
                continue
            # 进入技能释放流程
            def check_battle_end_callback():
                """战斗结束检测回调"""
                end_state = self.check_battle_end()
                if end_state:
                    logger.info(f"战斗结束，状态: {end_state}")
                    # 处理战斗结束后的退出流程
                    if not self.handle_battle_end(end_state):
                        logger.error("处理战斗结束流程失败")
                        return True  # 返回True表示战斗结束
                return False  # 返回False表示战斗继续

            # 执行技能释放和移动，同时检测战斗是否结束
            self.skill_manager.combat_loop(
                duration=180,
                check_interval=2,
                check_callback=check_battle_end_callback
            )

            logger.info("本轮挑战结束，准备下一轮")
        logger.info("秘境挑战任务完成")
        return True

    def check_current_page(self):
        """检查当前页面状态
        Returns:
            str: 返回当前页面状态，可能的值：
                - "忍者挑战页面": 检测到忍者挑战文字
                - "秘境入口页面": 检测到秘境探险入口
                - "创建房间页面": 检测到创建房间按钮
                - "出战页面": 检测到出战按钮
                - "unknown": 无法识别当前页面
        """
        # 检查是否在出战页面
        if self.game.find_image_on_screen("templates/mijing/start_battle.png", confidence=0.7)[0]:
            return "出战页面"

        # 检查是否在创建房间页面
        if self.game.find_image_on_screen("templates/mijing/create_room.png", confidence=0.7)[0]:
            return "创建房间页面"

        # 检查是否在秘境入口页面
        if self.game.find_image_on_screen("templates/mijing/mijing_entrance.png", confidence=0.7)[0]:
            return "秘境入口页面"

        # 检查是否在忍者挑战页面
        if self.game.find_image_on_screen("templates/mijing/renzhe_text.png", confidence=0.7)[0]:
            return "忍者挑战页面"

        return "unknown" 